package com.example.demo.HelloWord.Producer;

import com.example.demo.RabbitMqApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * HelloWord
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RabbitMqApplication.class)
public class Producer implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {

    @Resource
    private RabbitTemplate rabbitTemplate;

    /**
     * Hello模型的生产者
     */
    @Test
    public void TestProviderHello(){
        for (int i = 0; i < 20 ; i++) {
            //    发送消息 参数：             队列名称   发送内容
            rabbitTemplate.convertAndSend("hello_RabbitMq","Hello模型发送信息");
            System.out.println("发送成功");
        }

    }


    // fixme 下面都是confirm的配置 包括消息是否发送到交换机 以及是否发送到队列
     @PostConstruct
     public void init() {
         rabbitTemplate.setMandatory(true);
         rabbitTemplate.setConfirmCallback(this);
         rabbitTemplate.setReturnCallback(this);
     }

    //确认消息是否到达Exchange b为false则发送失败
    @Override
    public void confirm(CorrelationData correlationData, boolean b, String s) {
        if (!b) {
            //可以将消息写入本地，使用定时任务重新发送
            System.out.println("消息发送失败,失败原因:" + s);
        }else {
            System.out.println("发送到交换机成功");
        }
    }

    //确认消息是否到达Queue，消息发送失败触发(比如routing_key匹配不到queue)
    @Override
    public void returnedMessage(Message message, int i, String s, String s1, String s2) {
        System.out.println("进入returnCallback！exchange:" + s1 + ",routingkey:" + s2);
        System.out.println("消息内容:" + message + ",失败原因:" + s);
    }
}
